package com.yanhui.utils.string;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class _regexUtils {

	public static Boolean matchPattern(String pattren, String str){
		return Pattern.matches(pattren, str);
	}

	public static boolean isNumber(String str){
		return matchPattern("[0-9]*",str);
	}

	public static void main(String[] args) {
		String mobilePat = "^((13[0-9])|(14[5,7,9])|(15[^4,\\D])|(17[0,1,3,5-8])|(18[0-9]))\\d{8}$";
		//var regu = /^[1][3][0-9]{9}$/;
		//String regex = "(\\+\\d+)?1[3458]\\d{9}$";
		//固定电话号码 String regex = "(\\+\\d+)?(\\d{3,4}\\-?)?\\d{7,8}$";
		String mobile = "131433810801";
		System.out.println(matchPattern(mobilePat,mobile));

		String namePat = "^[\\w\\-－＿[０-９]\u4e00-\u9fa5\uFF21-\uFF3A\uFF41-\uFF5A]+$";
		String name = "131433810801";
		/**
		 * 验证用户名，支持中英文（包括全角字符）、数字、下划线和减号 （全角及汉字算两位）,长度为4-20位,中文按二位计数
		 */
		System.out.println(matchPattern(namePat,name));

		String emailPat = "^[\\w-]+(\\.[\\w-]+)*@[\\w-]+(\\.[\\w-]+)+$";
		//		String regex = "\\w+@\\w+\\.[a-z]+(\\.[a-z]+)?"; 
		String email = "490647751122.com";
		System.out.println(matchPattern(emailPat,email));

		String ipPat = "^(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)$";
		//String regex = "[1-9](\\d{1,2})?\\.(0|([1-9](\\d{1,2})?))\\.(0|([1-9](\\d{1,2})?))\\.(0|([1-9](\\d{1,2})?))"; 
		String ip = "534534";
		System.out.println(matchPattern(ipPat,ip));

		String numPat = "[0-9]*";
		String num = "534534";
		System.out.println("是否为数字："+matchPattern(numPat,num));

		//检查输入字符串是否为空或者全部都是空格
		String kgPat = "^[ ]+$";
		String kg ="      ";
		System.out.println(matchPattern(kgPat,kg));

		//检查空白字符
		String kg2Pat = "\\s+";
		String kg2 =" ";
		System.out.println("检查空白字符:"+matchPattern(kg2Pat,kg2));

		//检查输入对象的值是否符合整数格式
		String zsPat = "^[-]{0,1}[0-9]{1,}$";
		String zs ="-1252";
		System.out.println(matchPattern(zsPat,zs));

		//检查输入字符串是否符合正整数格式
		String zzsPat = "^[0-9]+$";
		String zzs ="1252";
		System.out.println(matchPattern(zzsPat,zzs));

		//检查输入字符串是否是带小数的数字格式,可以是负数
		String xsPat = "^[-]{0,1}(\\d+)[\\.]+(\\d+)$";
		//var regu = "^[0-9]+[\.][0-9]{0,3}$";
		String xs ="12.52";
		System.out.println(matchPattern(xsPat,xs));

		//验证身份证号码
		String idCardPat = "[1-9]\\d{13,16}[a-zA-Z0-9]{1}";
		String idCard ="4409811996ddd87441258";
		System.out.println("验证身份证号码:"+matchPattern(idCardPat,idCard));

		//验证中文
		String checkChinesePat = "^[\u4E00-\u9FA5]+$";
		String checkChinese ="44098119大幅度96ddd87441258";
		System.out.println("验证中文:"+matchPattern(checkChinesePat,checkChinese));

		//验证日期(生日)
		String checkDatePat = "[1-9]{4}([-./])\\d{1,2}\\1\\d{1,2}";
		String checkDate ="1992-08-21";
		System.out.println("验证日期:"+matchPattern(checkDatePat,checkDate));

		//验证URL地址
		String checkUrlPat = "(https?://(w{3}\\.)?)?\\w+\\.\\w+(\\.[a-zA-Z]+)*(:\\d{1,5})?(/\\w*)*(\\??(.+=.*)?(&.+=.*)?)?"; 
		String checkUrl ="http://blog.csdn.net/sinat_15153911";
		System.out.println("验证URL地址:"+matchPattern(checkUrlPat,checkUrl));

		//获取一级域名
		String domain = getDomain(checkUrl);
		System.out.println("获取一级域名:"+domain);

		//验证中国邮政编码
		String checkPostcodePat = "[1-9]\\d{5}"; 
		String checkPostcode ="510380";
		System.out.println("验证中国邮政编码:"+matchPattern(checkPostcodePat,checkPostcode));

		//验证合法QQ
		String checkQQPat = "^[1-9][0-9]{4,9}$"; 
		String checkQQ ="490647751";
		System.out.println("验证合法QQ:"+matchPattern(checkQQPat,checkQQ));

		String date = "2017-08-25";
		String fmt = "yyyy-MM-dd";
		System.out.println("判断是否为日期："+isDate(date,fmt));

		String str1 = "2017-18-25";
		String str2 = "205";
		System.out.println("字符"+str1+"是否以字符串"+str2+"结束："+isLastMatch(str1, str2));

		String str3 = "2017-18-25";
		String str4 = "20177";
		System.out.println("字符"+str3+"是否以字符串"+str4+"开始："+isFirstMatch(str3, str4));

		String str5 = "2017-18-25";
		String str6 = "18";
		System.out.println("字符"+str5+"是否包含字符串"+str6+"："+isMatch(str5, str6));

		
		Pattern pattern = Pattern
				.compile("(http://|ftp://|https://|www){0,1}[^\u4e00-\u9fa5\\s]*?\\.(com|net|cn|me|tw|fr)[^\u4e00-\u9fa5\\s]*");
		// 空格结束
		Matcher matcher = pattern
				.matcher("随碟附送下载地址http://www.xxx.com/sdfsdf.htm?aaaa=%ee%sss ?sdfsyyy空格结束");
		while (matcher.find()) {
			System.out.println(matcher.group(0));
		}

		// 中文结束
		matcher = pattern
				.matcher("随碟附送下载地址http://www.xxx.com/sdfsdf.htm?aaaa=%ee%sss网址结束");
		while (matcher.find()) {
			System.out.println(matcher.group(0));
		}

		// 没有http://开头
		matcher = pattern
				.matcher("随碟附送下载地址www.xxx.com/sdfsdf.htm?aaaa=%ee%sss网址结束");
		while (matcher.find()) {
			System.out.println(matcher.group(0));
		}

		// net域名
		matcher = pattern
				.matcher("随碟附送下载地址www.xxx.net/sdfsdf.htm?aaaa=%ee%sss网址结束");
		while (matcher.find()) {
			System.out.println(matcher.group(0));
		}

		// xxx域名
		matcher = pattern
				.matcher("随碟附送下载地址www.xxx.xxx/sdfsdf.htm?aaaa=%ee%sss网址结束");
		while (matcher.find()) {
			System.out.println(matcher.group(0));
		}

		// yyyy域名匹配不到
		System.out.println("匹配不到yyyy域名");
		matcher = pattern
				.matcher("随碟附送下载地址www.xxx.yyyy/sdfsdf.html?aaaa=%ee%sss网址结束");
		while (matcher.find()) {
			System.out.println(matcher.group(0));
		}

		// 没有http://www.
		matcher = pattern
				.matcher("随碟附送下载地址xxx.com/sdfsdf.html?aaaa=%ee%sss网址结束");
		while (matcher.find()) {
			System.out.println(matcher.group(0));
		}
		
		String url = "http://www.llp666.com/frim/index1.html";
		String getDoUrl = "http://" + getDomain(url);
		System.out.println(getDoUrl);



	}



	/*
	用途：判断是否是日期
	输入：date：日期；fmt：日期格式
	返回：如果通过验证返回true,否则返回false
	 */
	public static boolean isDate(String  date, String fmt){
		{
			if (fmt == null) {
				fmt = "yyyyMMdd";
			}
			int yIndex = fmt.indexOf("yyyy");
			if (yIndex ==- 1) {
				return false;
			}
			String year_ = date.substring(yIndex, yIndex + 4);
			int mIndex = fmt.indexOf("MM");
			if (mIndex ==- 1) {
				return false;
			}
			String month_ = date.substring(mIndex, mIndex + 2);
			int dIndex = fmt.indexOf("dd");
			if (dIndex ==- 1) {
				return false;
			}
			String day_ = date.substring(dIndex, dIndex + 2);
			Integer year = Integer.parseInt(year_);
			Integer month = Integer.parseInt(month_);
			Integer day = Integer.parseInt(day_);
			if (!isNumber(year+"") || year > 2100 || year < 1900) {
				return false;
			}
			if (!isNumber(month+"") || month > 12 || month < 1) {
				return false;
			}
			if (day > getMaxDay(year, month) || day < 1) {
				return false;
			}
			return true;
		}
	}


	public static Integer getMaxDay(Integer year, Integer month){
		if (month == 4 || month == 6 || month == 9 || month == 11) {
			return 30;
		}
		else if (month == 2) {
			if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
				return 29;
			}
			else {
				return 28;
			}
		}else{
			return 31;
		}
	}


	/*
	用途：字符1是否以字符串2结束
	输入：str1：字符串；str2：被包含的字符串
	返回：如果通过验证返回true,否则返回false
	 */
	public static boolean isLastMatch(String str1, String str2)
	{
		Integer index = str1.lastIndexOf(str2);
		if (str1.length() == index + str2.length()) {
			return true;
		}
		return false;
	};

	/*
	用途：字符1是否以字符串2开始
	输入：str1：字符串；str2：被包含的字符串
	返回：如果通过验证返回true,否则返回false
	 */
	public static boolean isFirstMatch(String str1, String str2)
	{
		Integer index = str1.indexOf(str2);
		if (index == 0) {
			return true;
		}
		return false;
	};

	/*
	用途：字符1是包含字符串2
	输入：str1：字符串；str2：被包含的字符串
	返回：如果通过验证返回true,否则返回false
	 */
	public static boolean isMatch(String str1, String str2)
	{
		Integer index = str1.indexOf(str2);
		if (index ==- 1) {
			return false;
		}
		return true;
	};

	/**
	 * <pre>
	 * 获取网址 URL 的一级域名
	 * http://detail.tmall.com/item.htm?spm=a230r.1.10.44.1xpDSH&id=15453106243&_u=f4ve1uq1092 ->> tmall.com
	 * </pre>
	 * 
	 * @param url
	 * @return
	 */
	public static String getDomain(String url) {
		Pattern p = Pattern.compile("(?<=http://|\\.)[^.]*?\\.(com|cn|net|org|biz|info|cc|tv)", Pattern.CASE_INSENSITIVE);
		// 获取完整的域名
		// Pattern p=Pattern.compile("[^//]*?\\.(com|cn|net|org|biz|info|cc|tv)", Pattern.CASE_INSENSITIVE);
		Matcher matcher = p.matcher(url);
		matcher.find();
		return matcher.group();
	}



	/**
	 * 校验数字

1 数字：^[0-9]*$

2 n位的数字：^d{n}$

3 至少n位的数字：^d{n,}$

4 m-n位的数字：^d{m,n}$

5 零和非零开头的数字：^(0|[1-9][0-9]*)$

6 非零开头的最多带两位小数的数字：^([1-9][0-9]*)+(.[0-9]{1,2})?$

7 带1-2位小数的正数或负数：^(-)?d+(.d{1,2})?$

8 正数、负数、和小数：^(-|+)?d+(.d+)?$

9 有两位小数的正实数：^[0-9]+(.[0-9]{2})?$

10 有1~3位小数的正实数：^[0-9]+(.[0-9]{1,3})?$

11 非零的正整数：^[1-9]d$ 或 ^([1-9][0-9]){1,3}$ 或^+?[1-9][0-9]*$

12 非零的负整数：^-[1-9][]0-9"$或 ^-[1-9]d$

13 非负整数：^d+$或^[1-9]d*|0$

14 非正整数：^-[1-9]d*|0$ 或 ^((-d+)|(0+))$

15 非负浮点数：^d+(.d+)?$ 或^[1-9]d.d|0.d[1-9]d|0?.0+|0$

16 非正浮点数：^((-d+(.d+)?)|(0+(.0+)?))$ 或 ^(-([1-9]d.d|0.d[1-9]d))|0?.0+|0$

17 正浮点数：^[1-9]d.d|0.d[1-9]d$或^(([0-9]+.[0-9][1-9][0-9])|([0-9][1-9][0-9].[0-9]+)|([0-9][1-9][0-9]))$

18 负浮点数：^-([1-9]d.d|0.d[1-9]d)$ 或 ^(-(([0-9]+.[0-9][1-9][0-9])|([0-9][1-9][0-9].[0-9]+)|([0-9][1-9][0-9])))$

19 浮点数：^(-?d+)(.d+)?$ 或 ^-?([1-9]d.d|0.d[1-9]d|0?.0+|0)$

校验字符

1 汉字：^[一-龥]{0,}$

2 英文和数字：^[A-Za-z0-9]+$或^[A-Za-z0-9]{4,40}$

3 长度为3-20的所有字符：^.{3,20}$

4 由26个英文字母组成的字符串：^[A-Za-z]+$

5 由26个大写英文字母组成的字符串：^[A-Z]+$

6 由26个小写英文字母组成的字符串：^[a-z]+$

7 由数字和26个英文字母组成的字符串：^[A-Za-z0-9]+$

8 由数字、26个英文字母或者下划线组成的字符串：^w+$或 ^w{3,20}$

9 中文、英文、数字包括下划线：^[一-龥A-Za-z0-9_]+$

10 中文、英文、数字但不包括下划线等符号：^[一-龥A-Za-z0-9]+$ 或 ^[一-龥A-Za-z0-9]{2,20}$

11 可以输入含有^%&',;=?$"等字符：[^%&',;=?$"]+

12 禁止输入含有~的字符：[^~"]+

校验表单

1 Email地址：^w+([-+.]w+)@w+([-.]w+).w+([-.]w+)*$

2 域名：[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?

3 InternetURL：[a-zA-z]+://[^s]或^http://([w-]+.)+[w-]+(/[w-./?%&=])?$

4 手机号码：^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])d{8}$

5 国内电话号码(××××-×××××××、×××-××××××××)：d{3}-d{8}|d{4}-d{7}

6 匹配中国大陆身份证：/^[1-9]d{5}[1-9]d{3}((0d)|(1[0-2]))(([0|1|2]d)|3[0-1])d{3}(d|x|X)$/

7 帐号是否合法(字母开头，允许5-16字节，允许字母数字下划线)：^[a-zA-Z][a-zA-Z0-9_]{4,15}$

8 密码(以字母开头，长度在6~18之间，只能包含字母、数字和下划线)：^[a-zA-Z]w{5,17}$

9 强密码(必须包含大小写字母和数字的组合，不能使用特殊字符，长度在8-10之间)：^(?=.d)(?=.[a-z])(?=.*[A-Z]).{8,10}$

10 日期格式：^d{4}-d{1,2}-d{1,2}

11 一年的12个月(01～09和1～12)：^(0?[1-9]|1[0-2])$

12 一个月的31天(01～09和1～31)：^((0?[1-9])|((1|2)[0-9])|30|31)$

13 空白行的正则表达式：s* (可以用来删除空白行)

14 腾讯QQ号：[1-9][0-9]{4,} (腾讯QQ号从10000开始)

15 中国邮政编码：[1-9]d{5}(?!d)(中国邮政编码为6位数字)

16 IP地址：d+.d+.d+.d+ (提取IP地址时有用)

17 IP地址：((?:(?:25[0-5]|2[0-4]d|[01]?d?d).){3}(?:25[0-5]|2[0-4]d|[01]?d?d))
	 */












}
